/*
    QU4.C
*/

#include <p_std.h>
#include <p_date.h>
#include <p_file.h>
#include <wlib.h>
#include <hwif.h>


LOCAL_D TEXT *cmds[]=
    {
    "iInches/Centimetres",
    "mMiles/Kilometres",
    "lPounds/Kilogrammes",
    "pPints/Litres",
    "fFahrenheit/Centigrade",
    "dDay of week",
    "cCombinations",
    "tTime difference",
    "hHoroscope",
    "nNow",
    "wPassword",
    "eEncrypt",
    "uDecrypt",
    "sSignificance",
    "zFile size",
    "xExit",
    NULL
    };

LOCAL_D H_MENU_DATA mdata[]=
    {
    "Conversions",5,
    "Calendar",5,
    "Secret",3,
    "Special",3,
    NULL
    };

GLDEF_D TEXT ** _cmds=(&cmds[0]);
GLDEF_D H_MENU_DATA * _mdata=(&mdata[0]);


LOCAL_D UINT MainWid;

LOCAL_D VOID *ttH;
LOCAL_D UWORD ttMonth=1;
LOCAL_D UWORD ttSuffix=1;
LOCAL_D UWORD ttDay=1;
LOCAL_D UWORD ttCentury=2;
LOCAL_D UWORD ttSeconds=2;


LOCAL_C INT AddNoYesChoiceList(TEXT *pmt,UWORD *pval)
    {
    return(uAddChoiceList(pmt,pval,"No","Yes",NULL));
    }

LOCAL_C VOID TimeNow(VOID)
    {
    INT values;
    H_DI_TEXT txt;
    TEXT buf[48];

    txt.str=(&buf[0]);
    do
        {
        if (uOpenDialog(NULL))
            return;
        uZTStoBCS(&buf[0],"Time is now");
        txt.type=H_DTEXT_ALIGN_CENTRE;
        if (uAddDialogItem(H_DIALOG_TEXT,NULL,&txt))
            return;
        values=0;
        if (ttMonth==2)
            values=H_TIME_FORMAT_MONTH_NAME;
        if (ttDay==2)
            values|=H_TIME_FORMAT_DAY_NAME;
        if (ttSuffix==2)
            values|=H_TIME_FORMAT_SUFFIX;
        if (ttCentury==1)
            values|=H_TIME_FORMAT_NO_CENTURY;
        if (ttSeconds==1)
            values|=H_TIME_FORMAT_NO_SECONDS;
        hTTSetFormat(ttH,values);
        hTTSetTime(ttH,H_TIME_SET_NOW,NULL);
        buf[0]=hTTSenseString(ttH,H_TIME_SENSE_BOTH,&buf[1]);
        txt.type=H_DTEXT_ALIGN_CENTRE|H_DTEXT_UNDERLINE;
        if (uAddDialogItem(H_DIALOG_TEXT,NULL,&txt))
            return;
        if (AddNoYesChoiceList("Give month name",&ttMonth))
            return;
        if (AddNoYesChoiceList("Give day name",&ttDay))
            return;
        if (AddNoYesChoiceList("Use date suffix",&ttSuffix))
            return;
        if (AddNoYesChoiceList("Show century",&ttCentury))
            return;
        if (AddNoYesChoiceList("Show seconds",&ttSeconds))
            return;
        } while (uRunDialog()>0);
    }

LOCAL_C VOID SetUpDiDate(H_DI_DATE *pdate,P_DAYSEC *pds)
    {
    ULONG sdate;

    sdate=p_date();
    p_sttods(&sdate,pds);
    pdate->value=(&pds->day);
    pdate->low=0;
    pdate->high=H_LAST_DAY;
    }

LOCAL_C VOID DayOfWeek(VOID)
    {
    P_DAYSEC ds;
    H_DI_DATE date;
    TEXT buf[40];
    H_DI_TEXT txt;

    SetUpDiDate(&date,&ds);
    do
        {
        p_nmday(&buf[1],p_wkday(ds.day));
        buf[0]=p_slen(&buf[1]);
        txt.str=(&buf[0]);
        txt.type=H_DTEXT_ALIGN_LEFT;
        if (uOpenDialog("Find day of week"))
            return;
        if (uAddDialogItem(H_DIALOG_DATE,"Date",&date))
            return;
        if (uAddDialogItem(H_DIALOG_TEXT,"Day of week",&txt))
            return;
        } while (uRunDialog()>0);
    }

LOCAL_C VOID FileSize(VOID)
    {
    TEXT fname[P_FNAMESIZE+2];
    H_DI_FSEL fsel;
    P_INFO info;
    TEXT buf[30];

    fname[0]=0;
    fsel.fname=(&fname[0]);
    fsel.flags=H_FILE_PICK_SELECTOR;
    FOREVER
        {
        if (uOpenDialog("Find file size"))
            return;
        if (uAddDialogItem(H_DIALOG_FSEL,"File:",&fsel))
            return;
        if (uRunDialog()<=0)
            return;
        fname[1+fname[0]]=0;
        if (!uErrorValue(p_finfo(&fname[1],&info)))
            {
            p_atos(&buf[0],"File size is %lu bytes",info.size);
            wInfoMsg(&buf[0]);
            }
        }
    }

LOCAL_C VOID ManageCommand(INT keycode)
    {
    INT index;
    TEXT buf[40];

    switch (keycode)
        {
    case 'd':
        DayOfWeek();
        break;
    case 'n':
        TimeNow();
        break;
    case 'z':
        FileSize();
        break;
    case 'x':
        p_exit(0);
    default:
        index=uLocateCommand(keycode);
        if (index>=0)
            {
            p_atos(&buf[0],"You chose `%s'",cmds[index]+1);
            wInfoMsg(&buf[0]);
            }
        }
    }

LOCAL_C VOID MainLoop(VOID)
    {
    INT ret;
    WMSG_KEY key;

    FOREVER
        {
        uGetKey(&key);
        if (key.keycode&W_SPECIAL_KEY)
            ManageCommand(key.keycode&(~W_SPECIAL_KEY));
        else if (key.keycode==W_KEY_MENU && !(key.modifiers&W_CTRL_MODIFIER))
            {
            ret=uPresentMenus();
            if (ret>0)
                ManageCommand(ret);
            }
        }
    }

LOCAL_C VOID ReduceScreenSize(VOID)
    {
    W_WINDATA wd;

    wd.extent.tl.x=wd.extent.tl.y=0;
    wd.extent.width=189;
    wd.extent.height=80;
    wSetWindow(MainWid,W_WIN_EXTENT,&wd);
    if (uErrorValue(wCheckPoint()))
        p_exit(0);
    }

LOCAL_C VOID CreateGC(VOID)
    {
    INT hgc;

    hgc=gCreateGC0(MainWid);
    if (hgc<0)
        p_exit(hgc);
    }

LOCAL_C VOID SpecificInit(VOID)
    {
    MainWid=uFindMainWid();
    ReduceScreenSize();
    CreateGC();
    gBorder(W_BORD_CORNER_4);
    wsEnable();
    ttH=hTTOpen();
    }

GLDEF_C VOID main(VOID)
    {
    uCommonInit();
    SpecificInit();
    MainLoop();
    }
